package LigacaoBd;

import java.sql.*;
import java.util.*;
/**
 * Classe para testar o acesso a uma BD relacional
 * com recurso a um ficheiro de texto do tipo '.properties'
 * que guarda todos os comandos SQL, o que permite separar
 * realmente o código JAVA do código SQL
 */
public class Teste_Acesso_BD {
    Connection connect;
    Statement stmt;
// instância de SQLCache guardará as strings que representam comandos SQL
    SQLCache cache;
    
    
    /**
     * Construtor que carrega as intruções SQL do ficheiro de properties
     * para o atributo 'cache' (instância de SQLCache)
     */
    public Teste_Acesso_BD() {
        cache = new SQLCache();
        cache.loadSQLStatements();
    }
    /**
     * Carrega o driver MySQL e abre a Connection em localhost, sem utilizar
password.
     */
    public void carregaDriverEAbreConnection(){
        try {
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            connect = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/mstand?"+
                    "user=root&password=123456");
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
            ex.printStackTrace();
        }
    }
    /**
     ** Abre um Statement.
     */
    public void abreStatement(){
        try {
            stmt = connect.createStatement();
        } catch(Exception e){ e.printStackTrace(); }
    }
    /**
     * Fecha um Statement.
     */
    public void fechaStatement(){
        try {
            stmt.close();
        } catch(Exception e){ e.printStackTrace(); }
    }
    /**
     * Fecha uma Connection.
     */
    public void fechaConnection(){
        try {
            connect.close();
        } catch(Exception e){ e.printStackTrace(); }
    }
    
    public void executeInsert(String qryName, Hashtable params) throws Exception {
        // instância de QueryResult guardará o resultado da query
        try {
            String query = cache.compileQuery(qryName,params);
             stmt.executeUpdate(query);
        } catch(Exception e){ e.printStackTrace(); }
    }
    /**
     * Método que executa uma query com recurso às classes
     * auxiliares SQLCache e QueryResult.
     */
    public QueryResult executeSelect(
            String qryName, Hashtable params) throws Exception {
// instância de QueryResult guardará o resultado da query
        QueryResult result = null;
        try {
            String query = cache.compileQuery(qryName,params);
            ResultSet rs = stmt.executeQuery(query);
            result = new QueryResult();
            result.populateData(rs);
        } catch(Exception e){ e.printStackTrace(); }
        return result;
    }
    /**
     * O método main testa a execução de uma query com parâmetros.
     */
    public boolean loginConfirm(String username, String password){
        Boolean validacao=false;
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        params.put("username", username);
        params.put("password", password);
        String qryName = new String("query3");
        QueryResult qr;
        try {
            qr = testeBD.executeSelect(qryName, params);            
            
            if(qr.tabela().isEmpty()){
                validacao= false;
            } else {
                validacao = true;
            }
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        
        return validacao;       
     }
    
    public String userID(String userName){
        
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        params.put("username", userName);
        String qryName = new String("query4");
        QueryResult qr = null;
        try {
            qr = testeBD.executeSelect(qryName, params);            
            
            
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        
        return qr.tabela().firstElement().toString();       
     }
    
        
    public Vector userInfo(String id){
        
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        params.put("utilizadorID", id);
        String qryName = new String("query5");
        QueryResult qr = null;
        try {
            qr = testeBD.executeSelect(qryName, params);            
            
            
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        
        return qr.tabela();       
     }

    public boolean novo_registo(String nome, String apelido, String bi, String telemovel, String email, String dataNasc, String utilizadors) {
        Boolean inserido=true;
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        params.put("nome", nome);
        params.put("apelido", apelido);
        params.put("bi", bi);
        params.put("telemovel", telemovel);
        params.put("email", email);
        params.put("dataNasc", dataNasc);
        params.put("utilizadors", utilizadors);       
        String qryName = new String("query7");
        try {
             testeBD.executeInsert(qryName, params);            
            
            
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        
        /*saber o proximo id de utilizador
        inserir os dados do novo utilizador
        inserir os dados de login do utilizador */

        return inserido;
    }


    public Vector n_utilizadores() {
          Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        String qryName = new String("query6");
        QueryResult qr = null;
        try {
            qr = testeBD.executeSelect(qryName, params);            
            
            
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        return qr.tabela();
        
    }

    public boolean novo_registoLogin(String username, String password, String utilizadors) {
          Boolean inserido=true;
         Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        params.put("username", username);
        params.put("password", password); 
        params.put("utilizadors", utilizadors); 
        String qryName = new String("query8");
       
        try {
          testeBD.executeInsert(qryName, params);               
            
            
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
          
          
              
          return inserido;
       
    }
    
    public Vector getCarros(int value) {
          Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
          testeBD.carregaDriverEAbreConnection();
          testeBD.abreStatement();
          Hashtable params = new Hashtable();
          String qryName="";
          switch(value) {
              case 0 : qryName = new String("query2");
                  break;
              case 1 : qryName = new String("query14");
                  break;
              case 2 : qryName = new String("query15");
                  break;
              case 3 : qryName = new String("query16");
                  break;
              case 4 : qryName = new String("query17");
                  break;
              case 5 : qryName = new String("query18");
                  break;
              default:
                  break;
          }
          
          QueryResult qr = null;
          try {
            qr = testeBD.executeSelect(qryName, params);              
        } catch(Exception ex){ ex.printStackTrace();}
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        return qr.tabela();
        
    }
    
    public Vector getCarros() {
          Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
          testeBD.carregaDriverEAbreConnection();
          testeBD.abreStatement();
          Hashtable params = new Hashtable();
          String qryName = new String("query2");
          QueryResult qr = null;
          try {
            qr = testeBD.executeSelect(qryName, params);              
        } catch(Exception ex){ ex.printStackTrace();}
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        return qr.tabela();
        
    }
    
    public Vector getComentarios(String id){
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        params.put("idCarro", id);
        String qryName = new String("query1");
        QueryResult qr = null;
        try {
            qr = testeBD.executeSelect(qryName, params);            
            
            
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        
        return qr.tabela();       
     }
    
     public Vector GetComentarios() {
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        String qryName = new String("query9");
        QueryResult qr = null;
        try {
            qr = testeBD.executeSelect(qryName, params);            
            
            
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        return qr.tabela();
        
    }

    public void insereComentario(String comment, String emailComentario, String nomeComentario, String carroComentario, String nComentario) {
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        
        params.put("comment", comment);
        params.put("emailComentario",emailComentario); 
        params.put("nomeComentario", nomeComentario); 
        params.put("carroComentario", carroComentario); 
        params.put("nComentario", nComentario); 
        
        String qryName = new String("query10");
       
        try {
          testeBD.executeInsert(qryName, params);               
                        
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
    }
    
    public int getPrecoActual(String idCarro){
        
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        params.put("idCarroActual", idCarro);
        String qryName = new String("query11");
        QueryResult qr = null;
        try {
            qr = testeBD.executeSelect(qryName, params);            
            
            
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
        
        return Integer.parseInt(qr.tabela().firstElement().toString());       
     }
    
     public void novaLicitacao(String idCarroActual, String novoValor) {
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        
        params.put("idCarroActual", idCarroActual);
        params.put("novoValor", String.valueOf(novoValor));        
        
        String qryName = new String("query12");
       
        try {
          testeBD.executeInsert(qryName, params);               
                        
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
    }
     
      public void insereCarro(String nCarro,String marca,String modelo,String ano,String caracteristicas,String fotos,String precoBase,String precoCompra,String idUser, String combustivel,String cilindrada) {
        Teste_Acesso_BD testeBD = new Teste_Acesso_BD();
        testeBD.carregaDriverEAbreConnection();
        testeBD.abreStatement();
        Hashtable params = new Hashtable();
        
        params.put("nCarro", nCarro);
        params.put("marca",marca); 
        params.put("modelo", modelo); 
        params.put("ano", ano); 
        params.put("caracteristicas", caracteristicas); 
        params.put("fotos", fotos); 
        params.put("precoBase", precoBase);
        params.put("precoCompra", precoCompra);
        params.put("idUser", idUser);
        params.put("combustivel", combustivel);
        params.put("cilindrada", cilindrada);
        
        String qryName = new String("query13");
       
        try {
          testeBD.executeInsert(qryName, params);               
                        
        } catch(Exception ex){ ex.printStackTrace();}
        
        testeBD.fechaStatement();
        testeBD.fechaConnection();
    }
}